package cn.snowheart

/**
 * Groovy 闭包
 * 闭包：一段小的匿名代码块，通常只有几行代码
 * 一个方法甚至可以将闭包作为参数
 * 闭包可以使用call方法进行调用
 *
 * @author liuwanxiang
 * @version 2019/05/31
 */
class ClosureExample {

    static void main(String[] args) {

        // 闭包的Demo
        closureDemo()

        // List中几个常用方法和闭包的结合
        listClosure()

    }

    static void listClosure(){
        def list = [1, 2, 3, 4]
        // 返回第一个满足条件的值
        println list.find { it > 2 }
        // 返回所有满足条件的值
        println list.findAll { it > 2 }
        // 集合中只要有值满足该条件，即返回true；否则返回false
        println list.any { it > 2 }
        println list.any { it > 4 }
        // 集合中所有值都满足该条件，即返回为true；否则返回false
        println list.every { it > 0 }
        println list.every { it > 2 }
        // 创建新的List，以原集合中的每个值为参考，根据闭包中的逻辑进行赋值，并返回
        println list.collect { return it * 2 }
        println list
    }

    static void closureDemo() {
        // 最简单的闭包
        def clo = { println "Hello World~" }
        clo.call()

        // 含参闭包
        clo = { param -> println "Hello ${param}" }
        clo.call("World")

        // 默认的it参数
        clo = { println "Hello ${it}" }
        clo.call("World")

        // 闭包中可以引用外部的变量
        def str = "Hello"
        clo = { println "${str} ${it}" }
        clo.call("World")

        // 将闭包作为方法入参使用，此时还可以使用方法外声明的变量
        method(clo)

        // List中的闭包
        def list = [1, 2, 3, 4]
        list.each { println it }
        list.each { if (it % 2 == 0) println it }

        // Map中的闭包
        def map = ["China": "中国", "USA": "美国"]
        map.each { println it }
        map.each { println "Key: ${it.key} Value: ${it.value}" }
    }

    static void method(closure) {
        closure.call("World!")
    }
}
